//
//  FGStatusListViewModel.swift
//  飞哥大微博
//
//  Created by huangfei on 2017/6/6.
//  Copyright © 2017年 huangfei. All rights reserved.
//

import Foundation

// 微博数据列表视图模型
/*
 父类的选择
 
 - 如果类需要使用 `KVC` 或者字典转模型框架设置对象值，类就需要继承自 NSObject
 - 如果类只是包装一些代码逻辑(写了一些函数)，可以不用任何父类，好处：更加轻量级
 - 提示：如果用 OC 写，一律都继承自 NSObject 即可
 
 使命：负责微博的数据处理
 1. 字典转模型
 2. 下拉／上拉刷新数据处理
 */

// 上拉刷新最大尝试次数
private let maxPullupTryTimes = 3

class FGStatusListViewModel {
    
    // 微博视图模型数组懒加载
    lazy var statusList = [FGStatusViewModel]()
    // 上拉刷新错误次数
    private var pullupErrorTimes = 0
    
    /// 加载微博数据
    ///
    /// - Parameter pullup: 是否上拉刷新
    /// - Parameter completion: 完成回调【网络请求是否成功,是否有更多的上拉刷新】
    func loadStatus(pullup:Bool,completion:@escaping (_ isSuccess:Bool,_ shouldRefresh:Bool) -> ()) {
        
        // 判断是否是上拉刷新,同时检查刷新错误
        if pullup && pullupErrorTimes > maxPullupTryTimes {
            completion(true,false)
            return
        }
        
        // since_id 取出数组中第一条微博的 id
        let since_id = pullup ? 0:(statusList.first?.status.id ?? 0)
        // 取出数组的最后一条微博的 id
        let max_id = !pullup ? 0:(statusList.last?.status.id ?? 0)
        
        FGNetworkManager.shared.statusList(since_id: since_id,max_id: max_id) { (list, isSuccess) in
            
            // 0.判断网络请求是否成功
            if !isSuccess {
                // 直接回调返回
                completion(false, false)
                return
            }
            
            // 1.字典转模型(此处应该用NSArray，因为swift中Array是结构体)
            // 1> 定义结果可变数组
            var array = [FGStatusViewModel]()
            // 2> 遍历服务器返回的字典数组，字典转模型
            for dict in list ?? [] {
                // a) 创建微博模型 
                let status = FGStatus()
                // b) 使用字典设置模型数值
                status.yy_modelSet(with: dict)
                // c) 使用微博模型创建微博视图模型
                let viewModel = FGStatusViewModel(model: status)
                // d) 添加到数组
                array.append(viewModel)
            }
            
            print("刷新到 \(array.count) 条数据")
            
            // 2.拼接数据(闭包里面用self) 
            // 下拉刷新，应该将结果数组拼接在数组前面
            if pullup {
                // 上拉刷新结束后，将结果拼接在数组的末尾
                self.statusList = self.statusList + array
            } else {
                //下拉刷新结束后，将结果拼接在数组的前面
                self.statusList = array + self.statusList
            }
            
            // 3.判断上拉刷新的数据量
            if pullup && array.count == 0 {
                self.pullupErrorTimes += 1
                completion(isSuccess, false)
            }else {
                // 3.完成回调
                completion(isSuccess,true)
            }
        }
    }
}
